/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} n
 * @return {ListNode}
 */
function ListNode(val) {
    this.val = val;
    this.next = null;
}
var removeNthFromEnd = function (head, n) {
    let preNode = new ListNode(8)
    preNode.next = head
    // 注意点，使用双指针的细节的关键是在于注意需要添加 一个新的节点用来处理只有一个节点的特殊情况，
    // 同时要将我们双指针都放在这个新加的节点上，避免后面会无法删除开始的第一个节点
    let fast = preNode
    let slow = preNode
    while(n){
        fast = fast.next
        n--
    }
    while(fast.next){
        fast = fast.next
        slow = slow.next
    }
    slow.next = slow.next.next

};